package com.simpou.tests.persistence.exception;

import com.simpou.commons.model.entity.BaseEntity;


/**
 * Exceção ocorrida em alguma operação DAO.
 *
 * @author Jonas Pereira
 * @since 2012-06-10
 * @version 2012-06-10
 */
public class DaoException extends RuntimeException {
    /**
     * @param type Define a operação que lançou a exceção.
     * @param entityClass Classe da entidade em operação.
     * @param message Mensagem adicional.
     */
    public DaoException(final DaoExceptionType type,
        final Class<?extends BaseEntity> entityClass, final String message) {
        this(type, entityClass, message, null);
    }

    /**
     * @param type Define a operação que lançou a exceção.
     * @param entityClass Classe da entidade em operação.
     * @param throwable Exceção lançada.
     */
    public DaoException(final DaoExceptionType type,
        final Class<?extends BaseEntity> entityClass, final Throwable throwable) {
        this(type, entityClass, null, throwable);
    }

    /**
     * @param type Define a operação que lançou a exceção.
     * @param entityClass Classe da entidade em operação.
     * @param message Mensagem adicional.
     * @param throwable Exceção lançada.
     */
    public DaoException(final DaoExceptionType type,
        final Class<?extends BaseEntity> entityClass, final String message,
        final Throwable throwable) {
        super("[" + entityClass.getSimpleName() + " on " + type.msg +
            " operation] " +
            ((message == null) ? throwable.getMessage() : message), throwable);
    }

    /**
     * Tipo da exceção do DAO, define em qual operação uma exceção foi lançado.
     */
    public enum DaoExceptionType {
        CREATE("create"),
        RETRIEVE_SINGLE("retrieve single"),
        RETRIEVE_LIST("retrieve list"),
        UPDATE("update"),
        DELETE("delete");
        
        private String msg;

        private DaoExceptionType(final String msg) {
            this.msg = msg;
        }
    }
}
